package com.ywq.app.web.mvc.epay;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ywq.app.biz.AlipayBiz;
import com.ywq.app.biz.ArtMadeBiz;
import com.ywq.app.biz.MemberBiz;
import com.ywq.app.domain.ArtMadeAudit;
import com.ywq.app.domain.ArtOrders;
import com.ywq.app.domain.Member;
import com.ywq.app.domain.MemberSecurity;
import com.ywq.common.exception.AppBusinessException;


@Controller
public class AlipayController {

	private final static Logger logger = LoggerFactory
			.getLogger(AlipayController.class);

//	private final String PAY_ORDER_SUCCESS = "payOrderSuc.htm";

//	private final String PAY_ORDER_FAIL = "payOrderFail.htm";

	@Autowired
	private AlipayBiz alipayBiz;
	@Autowired
	private MemberBiz memberBiz;
	@Autowired
	private ArtMadeBiz artMadeBiz;

	@RequestMapping(value = "/loginAlipay.htm")
	public String loginAlipay(HttpServletRequest request,
			HttpServletResponse response) throws AppBusinessException {
		try {
			response.setContentType("text/html; charset=UTF-8");
			PrintWriter out = response.getWriter();

			// //////////////////////////////////请求参数//////////////////////////////////////

			// 选填参数//

			// 防钓鱼时间戳
			String anti_phishing_key = "";
			// 获取客户端的IP地址，建议：编写获取客户端IP地址的程序
			String exter_invoke_ip = "";
			// 注意：
			// 1.请慎重选择是否开启防钓鱼功能
			// 2.exter_invoke_ip、anti_phishing_key一旦被设置过，那么它们就会成为必填参数
			// 3.开启防钓鱼功能后，服务器、本机电脑必须支持远程XML解析，请配置好该环境。
			// 4.建议使用POST方式请求数据
			// 示例：
			// anti_phishing_key = AlipayService.query_timestamp(); //获取防钓鱼时间戳函数
			// exter_invoke_ip = "202.1.1.1";

			// ////////////////////////////////////////////////////////////////////////////////

			// 把请求参数打包成数组
			Map<String, String> sParaTemp = new HashMap<String, String>();
			sParaTemp.put("anti_phishing_key", anti_phishing_key);
			sParaTemp.put("exter_invoke_ip", exter_invoke_ip);

			// 构造函数，生成请求URL
			String sHtmlText = alipayBiz.login(sParaTemp);
			out.println(sHtmlText);
		} catch (Exception e) {
			if (logger.isErrorEnabled()) {
				logger.error("Request[/loginAlipay.htm] fail", e);
			}
		}
		return null;
	}

	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/loginAlipayReturn.htm")
	public String loginAlipayReturn(HttpServletRequest request,
			HttpServletResponse response) throws AppBusinessException {
		try {
			response.setContentType("text/html; charset=UTF-8");
			PrintWriter out = response.getWriter();

			// 获取支付宝GET过来反馈信息
			Map<String, String> params = new HashMap<String, String>();
			Map requestParams = request.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter
					.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				// 乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				// valueStr = new String(valueStr.getBytes("ISO-8859-1"),
				// "UTF-8");
				params.put(name, valueStr);
			}

			// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//

			// 支付宝用户id
//			String user_id = request.getParameter("user_id");
			// 授权令牌
			String token = request.getParameter("token");

			// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

			// 计算得出通知验证结果
			boolean verify_result = alipayBiz.verify(params);

			if (verify_result) {// 验证成功
				// ////////////////////////////////////////////////////////////////////////////////////////
				// 请在这里加上商户的业务逻辑程序代码

				// ——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

				// 执行商户的业务程序

				// 该页面可做页面美工编辑
				out.println("验证成功<br />token:" + token);

				// etao专用
				if (request.getParameter("target_url") != null) {
					// 程序自动跳转到target_url参数指定的url去
				}

				// ——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

				// ////////////////////////////////////////////////////////////////////////////////////////
			} else {
				// 该页面可做页面美工编辑
				out.println("验证失败");
			}
		} catch (Exception e) {
			if (logger.isErrorEnabled()) {
				logger.error("Request[/loginAlipayReturn.htm] fail", e);
			}
		}
		return null;
	}

	@RequestMapping(value = "/alipayto.htm")
	public String alipayto(HttpServletRequest request,
			HttpServletResponse response) throws AppBusinessException {
		try {
			response.setContentType("text/html; charset=UTF-8");
			PrintWriter out = response.getWriter();

			// //////////////////////////////////请求参数//////////////////////////////////////

			// 必填参数//

			// 请与贵网站订单系统中的唯一订单号匹配
			String out_trade_no =request.getParameter("orderNum"); //request.getParameter("orderNum");
			// 订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。
			// String subject = new String(request.getParameter("subject")
			// .getBytes("ISO-8859-1"), "utf-8");
			ArtOrders order =memberBiz.getOrdersById(out_trade_no);
			String subject="";
			String body="";
			String total_fee = null;
			if(order!=null){
				 subject =order.getTitle(); //request.getParameter("subject");
			// 订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里
			// String body = new
			// String(request.getParameter("alibody").getBytes(
			// "ISO-8859-1"), "utf-8");
			    body = order.getArtPic().getContent();
			//request.getParameter("orderDesc");
			// 订单总金额，显示在支付宝收银台里的“应付总额”里
//*************************************************Order order = orderBiz.getOrderById(out_trade_no);
//*************************************************			if(order!=null){
//*************************************************			total_fee = String.valueOf(order.getTotalFee());
//*************************************************			}else{
				//total_fee = "0.01";
//*************************************************		}
				total_fee = String.valueOf(order.getSucPrice());
			}else{
				ArtMadeAudit artMadeAudit=artMadeBiz.getArtMadeAuditById(out_trade_no);
				if(artMadeAudit!=null){
					subject =artMadeAudit.getRemark();
					if("01".equals(artMadeAudit.getAuditKey())){
						total_fee = String.valueOf(artMadeAudit.getFirstMoney());
					}else if("02".equals(artMadeAudit.getAuditKey())){
						total_fee = String.valueOf(artMadeAudit.getSecondMoney());
					}else if("03".equals(artMadeAudit.getAuditKey())){
						total_fee = String.valueOf(artMadeAudit.getThirdMoney());
					}
				}else{
					
					MemberSecurity memberSecurity =memberBiz.getMemberSecurity(out_trade_no);
					if(memberSecurity!=null){
						subject=memberSecurity.getRemark();
						total_fee = String.valueOf(memberSecurity.getSecurityMoney());
					}else{
						return null;
					}
				}
			}
			/*if (!total_fee.equals("0.01")) {
				total_fee = "0.01";
			}*/

			// 扩展功能参数——默认支付方式//

			// 默认支付方式，取值见“即时到帐接口”技术文档中的请求参数列表
			String paymethod = "";
			// 默认网银代号，代号列表见“即时到帐接口”技术文档“附录”→“银行列表”
			String defaultbank = "";

			// 扩展功能参数——防钓鱼//

			// 防钓鱼时间戳
			String anti_phishing_key = "";
			// 获取客户端的IP地址，建议：编写获取客户端IP地址的程序
			//String exter_invoke_ip = "114.216.113.194";
			// 注意：
			// 1.请慎重选择是否开启防钓鱼功能
			// 2.exter_invoke_ip、anti_phishing_key一旦被设置过，那么它们就会成为必填参数
			// 3.开启防钓鱼功能后，服务器、本机电脑必须支持远程XML解析，请配置好该环境。
			// 4.建议使用POST方式请求数据
			// 示例：
			// anti_phishing_key = AlipayService.query_timestamp(); //获取防钓鱼时间戳函数
			// exter_invoke_ip = "202.1.1.1";

			// 扩展功能参数——其他///

			// 自定义参数，可存放任何内容（除=、&等特殊字符外），不会显示在页面上
			String extra_common_param = "";
			// 默认买家支付宝账号
			String buyer_email = "";
			// 商品展示地址，要用http:// 格式的完整路径，不允许加?id=123这类自定义参数
			// String show_url = "http://www.xxx.com/order/myorder.jsp";
			String show_url = request.getParameter("showUrl");

			// 扩展功能参数——分润(若要使用，请按照注释要求的格式赋值)//

			// 提成类型，该值为固定值：10，不需要修改
			String royalty_type = "";
			// 提成信息集
			String royalty_parameters = "";
			// 注意：
			// 与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条
			// 各分润金额的总和须小于等于total_fee
			// 提成信息集格式为：收款方Email_1^金额1^备注1|收款方Email_2^金额2^备注2
			// 示例：
			// royalty_type = "10"
			// royalty_parameters =
			// "111@126.com^0.01^分润备注一|222@126.com^0.01^分润备注二"

			// ////////////////////////////////////////////////////////////////////////////////

			// 把请求参数打包成数组
			Map<String, String> sParaTemp = new HashMap<String, String>();
			sParaTemp.put("payment_type", "1");
			sParaTemp.put("out_trade_no", out_trade_no);
			sParaTemp.put("subject", subject);
			sParaTemp.put("body", body);
			sParaTemp.put("total_fee", total_fee);
			sParaTemp.put("show_url", alipayBiz.getServer() + show_url);
			sParaTemp.put("paymethod", paymethod);
			sParaTemp.put("defaultbank", defaultbank);
			sParaTemp.put("anti_phishing_key", anti_phishing_key);
			//sParaTemp.put("exter_invoke_ip", exter_invoke_ip);
			sParaTemp.put("extra_common_param", extra_common_param);
			sParaTemp.put("buyer_email", buyer_email);
			sParaTemp.put("royalty_type", royalty_type);
			sParaTemp.put("royalty_parameters", royalty_parameters);

			// 构造函数，生成请求URL
			String sHtmlText = alipayBiz.pay(sParaTemp);
			out.println(sHtmlText);
		} catch (Exception e) {
			if (logger.isErrorEnabled()) {
				logger.error("Request[/alipayto.htm] fail", e);
			}
		}
		return null;
	}

	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/alipaytoReturn.htm")
	public String alipaytoReturn(HttpServletRequest request,
			HttpServletResponse response) throws AppBusinessException {
		try {
			// 获取支付宝GET过来反馈信息
			Map<String, String> params = new HashMap<String, String>(); 
			Map requestParams = request.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter
					.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				// 乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				// valueStr = new String(valueStr.getBytes("ISO-8859-1"),
				// "UTF-8");
				params.put(name, valueStr);
			}

			// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//

//			String trade_no = request.getParameter("trade_no"); // 支付宝交易号
			String order_no = request.getParameter("out_trade_no"); // 获取订单号 
	//		String total_fee = request.getParameter("total_fee"); // 获取总金额
			// String subject = new String(request.getParameter("subject")
			// .getBytes("ISO-8859-1"), "utf-8");// 商品名称、订单名称
//			String subject = request.getParameter("subject");// 商品名称、订单名称
	//		String body = "";
			if (request.getParameter("body") != null) {
				// body = new String(request.getParameter("body").getBytes(
				// "ISO-8859-1"), "utf-8");// 商品描述、订单备注、描述
		//		body = request.getParameter("body");// 商品描述、订单备注、描述
			}
//			String buyer_email = request.getParameter("buyer_email"); // 买家支付宝账号
			String trade_status = request.getParameter("trade_status"); // 交易状态
//
//			String extra_common_param = request
//					.getParameter("extra_common_param");
/*
			String queryString = "?callback=return&orderNum=" + order_no
					+ "&subject=" + URLEncoder.encode(subject, "UTF-8")
					+ "&orderDesc=" + URLEncoder.encode(body, "UTF-8")
					+ "&totalFee=" + total_fee;
			String successUrl = alipayBiz.getServer() + PAY_ORDER_SUCCESS
					+ queryString;
			String failUrl = alipayBiz.getServer() + PAY_ORDER_FAIL
					+ queryString;*/

			// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

			// 计算得出通知验证结果
			boolean verify_result = alipayBiz.verify(params);

			if (verify_result) {// 验证成功
				// ////////////////////////////////////////////////////////////////////////////////////////
				// 请在这里加上商户的业务逻辑程序代码

				// ——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

				if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {
					// 判断该笔订单是否在商户网站中已经做过处理
					// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					// 如果有做过处理，不执行商户的业务程序
					
				//	response.sendRedirect(successUrl);
					return callBackReturnSuc(order_no, request);
				}

				// 该页面可做页面美工编辑
				// out.println("验证成功<br />");
				// out.println("trade_no=" + trade_no);

				// ——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

				// ////////////////////////////////////////////////////////////////////////////////////////
			} else {
				// 该页面可做页面美工编辑
				// out.println("验证失败");
//				response.sendRedirect(failUrl);
				return callBackReturnFail(order_no);
			}
		} catch (Exception e) {
			if (logger.isErrorEnabled()) {
				logger.error("Request[/alipaytoReturn.htm] fail", e);
			}
		}
		return null;
	}

	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/alipaytoNotify.htm")
	public String alipaytoNotify(HttpServletRequest request,
			HttpServletResponse response) throws AppBusinessException {
		try {
			// 获取支付宝POST过来反馈信息
			Map<String, String> params = new HashMap<String, String>();
			Map requestParams = request.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter
					.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				// 乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				// valueStr = new String(valueStr.getBytes("ISO-8859-1"),
				// "UTF-8");
				params.put(name, valueStr);
			}

			// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//

//			String trade_no = request.getParameter("trade_no"); // 支付宝交易号
			String order_no = request.getParameter("out_trade_no"); // 获取订单号
	//		String total_fee = request.getParameter("total_fee"); // 获取总金额
//			String subject = new String(request.getParameter("subject")
//					.getBytes("ISO-8859-1"), "utf-8");// 商品名称、订单名称
	//		String subject = request.getParameter("subject");// 商品名称、订单名称
	//		String body = "";
			if (request.getParameter("body") != null) {
//				body = new String(request.getParameter("body").getBytes(
//						"ISO-8859-1"), "utf-8");// 商品描述、订单备注、描述
		//		body = request.getParameter("body");// 商品描述、订单备注、描述
			}
//			String buyer_email = request.getParameter("buyer_email"); // 买家支付宝账号
			String trade_status = request.getParameter("trade_status"); // 交易状态

//			String extra_common_param = request
//					.getParameter("extra_common_param");

			/*String queryString = "?callback=return&orderNum=" + order_no
					+ "&subject=" + URLEncoder.encode(subject, "UTF-8")
					+ "&orderDesc=" + URLEncoder.encode(body, "UTF-8")
					+ "&totalFee=" + total_fee;
			String successUrl = alipayBiz.getServer() + PAY_ORDER_SUCCESS
					+ queryString;
			String failUrl = alipayBiz.getServer() + PAY_ORDER_FAIL
					+ queryString;*/

			// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

			if (alipayBiz.verify(params)) {// 验证成功
				// ////////////////////////////////////////////////////////////////////////////////////////
				// 请在这里加上商户的业务逻辑程序代码

				// ——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

				if (trade_status.equals("TRADE_FINISHED")) {
					// 判断该笔订单是否在商户网站中已经做过处理
					// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					// 如果有做过处理，不执行商户的业务程序

					// 注意：
					// 该种交易状态只在两种情况下出现
					// 1、开通了普通即时到账，买家付款成功后。
					// 2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
//					response.sendRedirect(successUrl);
					return callBackNotifySuc(order_no, request, response);
				} else if (trade_status.equals("TRADE_SUCCESS")) {
					// 判断该笔订单是否在商户网站中已经做过处理
					// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					// 如果有做过处理，不执行商户的业务程序

					// 注意：
					// 该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
					return callBackNotifySuc(order_no, request, response);
//					response.sendRedirect(successUrl);
				}

				// ——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

				// out.println("success"); // 请不要修改或删除——

				// ////////////////////////////////////////////////////////////////////////////////////////
			} else {// 验证失败
				// out.println("fail");

//				response.sendRedirect(failUrl);
				return callBackNotifyFail(order_no, request, response);
			}
		} catch (Exception e) {
			if (logger.isErrorEnabled()) {
				logger.error("Request[/alipaytoNotify.htm] fail", e);
			}
		}
		return null;
	}
	
	private String callBackReturnSuc(String orderId,HttpServletRequest request)throws AppBusinessException{
		ArtOrders order =memberBiz.getOrdersById(orderId);
		float   total_fee = 0;
		if(order!=null){
			total_fee=order.getSucPrice();
			request.setAttribute("sucPrice", total_fee);
		}else{
			ArtMadeAudit artMadeAudit=artMadeBiz.getArtMadeAuditById(orderId);
			if(artMadeAudit!=null){
				if("01".equals(artMadeAudit.getAuditKey())){
					total_fee = artMadeAudit.getFirstMoney();
					request.setAttribute("sucPrice", total_fee);
				}else if("02".equals(artMadeAudit.getAuditKey())){
					total_fee =  artMadeAudit.getSecondMoney() ;
					request.setAttribute("sucPrice", total_fee);
				}else if("03".equals(artMadeAudit.getAuditKey())){
					total_fee =  artMadeAudit.getThirdMoney();
					request.setAttribute("sucPrice", total_fee);
				}
			}else{
				MemberSecurity memberSecurity =memberBiz.getMemberSecurity(orderId);
				if(memberSecurity!=null){
					total_fee =  memberSecurity.getSecurityMoney();
					request.setAttribute("sucPrice", total_fee);
				}else{
					return "artOne/common/payOrderFail";
				}
			}
		}
	    Date dt = new Date();   
	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");   
	    String nowDate=sdf.format(dt); 
	    request.setAttribute("nowDate", nowDate);
		request.setAttribute("orderId", orderId);
		return "artOne/common/payOrderSuc";
	}
	private String callBackReturnFail(String orderId)throws AppBusinessException{
		return "artOne/common/payOrderFail";
	}
	private String callBackNotifySuc(String orderId,HttpServletRequest request,HttpServletResponse response)throws AppBusinessException{
		//*************************************************		Order order = getOrderById(orderId);
		/*if(order != null){
			request.setAttribute("order", order);
			response.setContentType("text/html; charset=UTF-8");
			PrintWriter pw = null;
			try {
				pw = response.getWriter();
//				支付成功后
				orderBiz.payOrderSuc(order);
				pw.println("success");
			} catch (Exception e){
				try {
					pw = response.getWriter();
				} catch (IOException e1) {
					pw.println("fail");
					e1.printStackTrace();
				}
				pw.println("fail");
				if (logger.isErrorEnabled()) {
					logger.error("get printWriter failure.", e);
				}
			}
		}*/
		ArtOrders order =memberBiz.getOrdersById(orderId);
		if(order!=null){
			memberBiz.payAlipaySuc(orderId);
			System.out.println("定单————————————————————————————————————————————————定单");
		}else{
			ArtMadeAudit artMadeAudit=artMadeBiz.getArtMadeAuditById(orderId);
			if(artMadeAudit!=null){
					artMadeBiz.updateMadePay(artMadeAudit.getMadeId(),artMadeAudit.getAuditKey());
					System.out.println("定制————————————————————————————————————————————————定制");
			}else{
				MemberSecurity memberSecurity =memberBiz.getMemberSecurity(orderId);
				if(memberSecurity!=null){
					String total_fee = request.getParameter("total_fee");
					System.out.println("保证金1————————————————————————————————————————————————保证金1"+total_fee);
					if(total_fee.equals(String.valueOf(memberSecurity.getSecurityMoney()))){
						System.out.println("保证金2————————————————————————————————————————————————保证金2"+total_fee);
						Member member=memberBiz.getMemberById(memberSecurity.getMemberId());
						Member newMember= new Member();
						newMember.setId(member.getId());
						newMember.setArtAccount(member.getArtAccount()+memberSecurity.getSecurityMoney());
						memberBiz.updateSecurityMoney(newMember);
						System.out.println("保证金————————————————————————————————————————————————保证金"+total_fee);
					}
				}
			}
		}
		return null;
	}
	private String callBackNotifyFail(String orderId,HttpServletRequest request,HttpServletResponse response)throws AppBusinessException{
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter pw = null; 
		try {
			pw = response.getWriter();
			pw.println("success");
		} catch (Exception e) {
			try {
				pw = response.getWriter();
			} catch (IOException e1) {
				pw.println("fail");
				e1.printStackTrace();
			}
			pw.println("fail");
			if (logger.isErrorEnabled()) {
				logger.error("get printWriter failure.", e);
			}
		}
		return null;
	}
	/*Order getOrderById(String orderId) throws AppBusinessException{
		Order order = orderBiz.getOrderById(orderId);
		if(order != null){
			List<OrderProduct> opList = orderBiz.getOpList(order.getId());
			order.setOpList(opList);
		
		}
		return order;
	}*/
}
